﻿#define  _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <ctype.h>
#include <assert.h>

//const char* src 只是不能通过 *src 修改，其他方法仍然可以？


//库函数中自带的 “判断是否为小写字母或者是大写字母” 的库函数

//int main()
//{
//	int ret = islower('a');
//	//printf("%d\n", ret);
//	//ret = islower('A');
//	//printf("%d\n", ret);
//	//ret = islower(0);
//	//printf("%d\n", ret);
//	//ret = isupper('A');
//	printf("%d\n", ret);
//
//	return 0;
//}


//将字符串中的小写字母转大写

//void function(char* p)
//{
//	while (*p != '\0')
//	{
//		if (islower(*p))
//		{
//			*p -= 32;
//		}
//		p++;
//	}
//}
//
//int main()
//{
//	char str[] = "I am a Student.";
//	function(str);
//	printf("%s", str);
//	return 0;
//}

//用库函数的方式实现

//void function(char* p)
//{
//	while (*p = toupper(*p))
//	{
//		p++;
//	}
//}
//
//int main()
//{
//	char str[] = "I am a Student.";
//	function(str);
//	printf("%s", str);
//	return 0;
//}



//C语言自带的将小写转大写，大写转小写的库函数

//int main()
//{
//	printf("%c\n", tolower('A'));
//	printf("%c\n", toupper('a'));
//	printf("%c\n", toupper('\0'));
//	
//	return 0;
//}


//模拟实现 strlen

#include <string.h>

//法一

//int my_strlen(char* p)
//{
//	int count = 0;
//	while (*p != '\0')
//	{
//		count++;
//		p++;
//	}
//	return count;
//}
//
//int main()
//{
//	char arr[] = "abcdefg";
//	int ret =my_strlen(arr);
//	printf("%d", ret);
//	return 0;
//}


//法二 指针-指针

//int my_strlen(char* p)
//{
//	assert(p);
//	char* start = p;
//	while (*p != '\0')
//	{
//		p++;
//	}
//	return p - start;
//}
//
//int main()
//{
//	char arr[] = "abcdeadsfg ";
//	int ret = my_strlen(arr);
//	printf("%d", ret);
//	return 0;
//}


//法三 递归

//int my_strlen(char* p)
//{
//	//p = NULL;
//	assert(p );
//	if (*p == '\0')
//	{
//		return 0;
//	}
//	else
//	{
//		return 1 + my_strlen(p + 1);
//	}
//}
//
//int main()
//{
//	char arr[] = "abcdefg";
//	int ret = my_strlen(arr);
//	printf("%d", ret);
//	return 0;
//}


//strcpy strncpy  的使⽤和模拟实现

//int main()
//{
//	char str1[] = "hello world";
//	char str2[20] = { 0 };
//	strcpy(str2, str1);
//	printf("%s", str2);
//}

//int main()
//{
//	char str1[] = "hello world";
//	char str2[20] = { 0 };
//	strncpy(str2, str1,5);
//	printf("%s", str2);
//}


//strcpy的模拟实现

//void my_strcpy(char* dest, const char* sor)
//{
//	assert(dest && sor);
//
//	while (*sor != '\0')
//	{
//		*dest = *sor;
//		dest++;
//		sor++;
//	}
//}
//
//int main()
//{
//	char str1[] = "hello world";
//	char str2[12] = { 0 };
//	my_strcpy(str2, str1);
//	printf("%s", str2);
//}

//void my_strcpy(char* dest, const char* sor)
//{
//	assert(dest && sor);
//
//	while (*dest++ = *sor++)
//	{
//		;
//	}
//}
//
//int main()
//{
//	char str1[] = "hello world";
//	char str2[12] = { 0 };
//	my_strcpy(str2, str1);
//	printf("%s", str2);
//}


//strcat strncat 的使⽤

//int main()
//{
//	char arr1[20] = "hello ";
//	char arr2[] = "world";
//	strcat(arr1, arr2);
//	printf("%s", arr1);
//	return 0;
//}

//int main()
//{
//	char arr1[20] = "hello ";
//	char arr2[] = "world";
//	strncat(arr1, arr2,3);
//	printf("%s", arr1);
//	return 0;
//}


//模拟实现 strcat

//void my_strcat(char* dest, const char* sor)
//{
//	assert(dest && sor);
//	while (*dest != '\0')
//	{
//		dest++;
//	}
//	while (*dest++ = *sor++)
//	{
//		;
//	}
//}
//
//int main()
//{
//	char arr1[20] = "hello ";
//	char arr2[] = "world";
//	my_strcat(arr1,arr2);
//	printf("%s", arr1);
//	return 0;
//}


//strcmp strncmp 的使⽤

//int main()
//{
//	char arr1[] = "abc";
//	char arr2[] = "abe";
//	int ret = strcmp(arr1, arr2);
//	printf("%d", ret);
//	return 0;
// }

//int main()
//{
//	char arr1[] = "abc";
//	char arr2[] = "abe";
//	int ret = strncmp(arr1, arr2,2);
//	printf("%d", ret);
//	return 0;
// }

//模拟实现 strcmp

//int my_strcmp(char* p1, char* p2)
//{
//	assert(p1 && p2);
//	while (*p1 == *p2)
//	{
//		if (*p1 == '\0')
//		{
//			return 0;
//		}
//		p1++;
//		p2++;
//	}
//	if (*p1 > *p2)
//	{
//		return *p1 - *p2;
//	}
//	else
//		return *p2 - *p1;
//
//}
//
//int main()
//{
//	char arr1[] = "abc";
//	char arr2[] = "abc";
//	int ret = my_strcmp(arr1, arr2);
//	printf("%d", ret);
//	return 0;
//}


//strtok 函数的使⽤

int main()
{
	char arr1[] = "cao_zhe_jun_1013@gmail.com";
	char buf[256];
	char arr2[] = "@._";
	strcpy(buf, arr1);
	char* ret = NULL;
	for (ret = strtok(arr1, arr2); ret != NULL; ret = strtok(NULL, arr2))//将arr1和arr2 传入，根据arr2中的内容，会将第一个_打印成\0，然后把起始地址传给ret，
	{																	//因为ret满足条件，开始打印
		printf("%s\n", ret);											//因为是字符串输出，字符串会根据ret内的地址，打印至第一个\0，该\0是strtok函数修改的
	}																	//开始做调整，第二次从第一个\0的位置开始向后直至遇到第二个\0；再判断，满足条件则继续打印，
																		//直至当最后一次调整，ret 被调整成\0，不满足循环，则跳出语句
																	    //strtok 库函数，一定包含一个static，能够寄存前一次循环的地址位置，
	return 0;
}


